/**
 * @file servo.h
 * @author SunWater
 * @brief 舵机控制
 * @version 0.1
 * @date 2024-10-21
 *
 * @copyright Copyright (c) 2024
 *
 */

#ifndef __servo_H
#define __servo_H

#include "bsp_pwm.h"
#include "main.h"

// ---------------- 舵机相关事项 ----------------
// 舵机配置结构体指针
typedef struct {
    TIM_HandleTypeDef *servo_htim;  // 舵机计数器句柄
    uint32_t tim_channel;           // 计数器通道
    
    float duty_percent_min;         // 最小占空比
    float duty_percent_max;         // 最大占空比

    uint16_t servo_degree_min;  // 舵机最小角度
    uint16_t servo_degree_max;  // 舵机最大角度
} Servo_Config;

// 舵机结构体
typedef struct {
    PWM servo_pwm;  // 舵机PWM结构体

    float duty_percent_min;  // 最小占空比
    float duty_percent_max;  // 最大占空比

    uint16_t servo_degree_min;  // 舵机最小角度
    uint16_t servo_degree_max;  // 舵机最大角度
} Servo;

/// @brief 舵机初始化
/// @param servo_p 舵机结构体指针
/// @param servo_config 舵机配置结构体指针
void Servo_init(Servo *servo_p, Servo_Config *servo_config);

/// @brief 舵机旋转至一特定角度
/// @param servo_p 舵机结构体指针
/// @param degrees 旋转角度
void Servo_spin_to_deg(Servo *servo_p, float degrees);

/// @brief 舵机旋转至一特定弧度
/// @param servo_p 舵机结构体指针
/// @param rad 旋转弧度
void Servo_spin_to_rad(Servo *servo_p, float rad);

#endif
